package kafeisc.utils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

/**
 * 用于生成验证码
 * @Classname YanZhengMa
 * @Description TODO
 * @Date 2020/4/28 14:05
 * @Created 
 */
   public class YanZhengMa {
   private int w = 70;
   private int h = 35;
   private Random r = new Random();
   private String[] fontNames = {"宋体","华文斜体","黑体","华文新魏","华文隶书","微软雅黑"};
   private String codes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
   private Color bgColor = new Color(255,255,255);
   private String text;

   private Color randomColor(){
      int red = r.nextInt(150);
      int green = r.nextInt(150);
      int blue = r.nextInt(150);
      return new Color(red,green,blue);
   }

   private Font randomFont(){
      int index = r.nextInt(fontNames.length);
      String fontName = fontNames[index];
      int style = r.nextInt(4);
      int size = r.nextInt(5) + 24;
      return new Font(fontName,style,size);
   }

   private void drawLine(BufferedImage image){
      int num = 3;
      Graphics2D g2 = (Graphics2D)image.getGraphics();
      for(int i=0;i < num;i++){
         int x1 = r.nextInt(w);
         int y1 = r.nextInt(h);
         int x2 = r.nextInt(w);
         int y2 = r.nextInt(h);
         g2.setStroke(new BasicStroke(1.5F));
         g2.setColor(Color.BLUE);
         g2.drawLine(x1,y1,x2,y2);
      }
   }

   private char randomChar(){
      int index = r.nextInt(codes.length());
      return codes.charAt(index);
   }

   private BufferedImage createImage(){
      BufferedImage image = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
      Graphics2D g2 = (Graphics2D)image.getGraphics();
      g2.setColor(Color.yellow);
      g2.fillRect(0,0,w,h);
      return image;
   }

   // 获取验证图片
   public BufferedImage getImage(){
      BufferedImage image = createImage();
      Graphics2D g2 = (Graphics2D)image.getGraphics();
      StringBuilder sd = new StringBuilder();
      // 向图片中画4个字符
      for(int i=0;i < 4;i++){
         String s = randomChar() + "";
         sd.append(s);
         float x = i * 1.0F * w / 4;
         g2.setFont(randomFont());
         g2.setColor(randomColor());
         g2.drawString(s,x,h-5);
      }
      this.text = sd.toString();
      drawLine(image);
      return image;
   }

   public String getText(){
      return text;
   }

   // 把图片输出到浏览器上，进行显示
   public static void output(BufferedImage image, OutputStream out) throws IOException {
      ImageIO.write(image,"JPEG",out);
   }
   }
